<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>一起学Excel</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta property="og:type" content="website">
<meta property="og:title" content="一起学Excel">
<meta property="og:url" content="https://lecoder.gitee.io/study-excel/page/66/index.html">
<meta property="og:site_name" content="一起学Excel">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="lijile">
<meta name="twitter:card" content="summary">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/study-excel/css/style.css">

<meta name="generator" content="Hexo 6.3.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/study-excel/" id="logo">一起学Excel</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/study-excel/">Home</a>
        
          <a class="main-nav-link" href="/study-excel/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://lecoder.gitee.io/study-excel"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main">
  
    <article id="post-vba-function-basics" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-function-basics/" class="article-date">
  <time datetime="2022-11-23T08:00:48.463Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-function-basics/">VBA 函数(Function)入门教程和实例</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>在今天的这篇文章，学习函数的基础，包括如何写、传入参数、返回参数、执行过程等。</p>
<h2 id="VBA-函数基础语法"><a href="#VBA-函数基础语法" class="headerlink" title="VBA 函数基础语法"></a>VBA 函数基础语法</h2><p>VBA 函数与 <a href="/study-excel/vba-subroutine-basics/">VBA 过程</a>很相似，除了使用的关键词外，主要区别是，函数可以返回值。</p>
<h3 id="无参数函数"><a href="#无参数函数" class="headerlink" title="无参数函数"></a>无参数函数</h3><p>无参数 VBA 函数的基本语法如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Function [函数名]() As [返回值类型]</span><br><span class="line">    语句1</span><br><span class="line">    语句2</span><br><span class="line">    ...</span><br><span class="line">    语句n</span><br><span class="line">    [函数名] = [返回值]</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p>可以看到，函数使用 <code>Function</code> 和 <code>End Function</code> 语句作为函数的开始和结束。</p>
<p>函数包含的语句中，相比过程，可以看到多一个 <code>[函数名] = [返回值]</code> 语句，这是函数的返回值语句。函数名后制定该函数返回值的类型，语法与声明变量类似。</p>
<p>看一个实际的例子。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x27;声明函数，该函数随机返回 true 或 false。函数需指定返回值类型。</span><br><span class="line">Function RandomLogic() As Boolean</span><br><span class="line">    RandomLogic = Rnd() &gt; 0.5</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p>该函数的名称是 <code>RandomLogic</code>，返回值类型时 <code>Boolean</code> 类型，运行调用后，随机返回一个 <code>true</code> 或 <code>false</code> 值。实现方法是，使用 VBA 内置函数 Rnd（随机产生0-1的数字），随机数与0.5对比大小，产生 true 或 false 值，并把值赋值给函数名。</p>
<h3 id="有参数函数"><a href="#有参数函数" class="headerlink" title="有参数函数"></a>有参数函数</h3><p>函数与过程一样，也可以接收参数，其语法与过程相同。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Function [函数名]([变量名1] As [数据类型1],...[变量名n] As [数据类型n]) As [返回值类型]</span><br><span class="line">    语句1</span><br><span class="line">    语句2</span><br><span class="line">    ...</span><br><span class="line">    语句3</span><br><span class="line">    [函数名] = [返回值]</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p>同样，函数接收的参数，在函数主体中使用。</p>
<p>我们看一个实际的例子。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Function Add2Number(num1 As Double, num2 As Double) As Double</span><br><span class="line">    Add2Number = num1 + num2</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p>上述函数接受2个 <code>Double</code> 类型的数字作为参数，两者相加，返回和，其类型也是 <code>Double</code> 类型。</p>
<h2 id="调用函数（Function）"><a href="#调用函数（Function）" class="headerlink" title="调用函数（Function）"></a>调用函数（Function）</h2><p>函数与<a href="/study-excel/vba-subroutine-basics/">子过程</a>的区别是，函数可以返回值。如果一个函数不返回值，它与子过程并无区别，其中调用方式与子过程相同。</p>
<p>调用有返回值的函数时，一般有两种情形：</p>
<ul>
<li>一是，使用一个变量存储函数返回的值</li>
<li>二是，函数返回的值参与其他计算</li>
</ul>
<p>两种情形调用函数方式相同，无参数函数直接书写，<strong>有参数函数将参数放在括号内</strong>。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">Sub Main()</span><br><span class="line">    &#x27;使用变量存储函数返回的值</span><br><span class="line">    Dim result1 As Double</span><br><span class="line">    result1 = Add(12, 345)</span><br><span class="line">    </span><br><span class="line">    &#x27;函数返回值继续参与计算</span><br><span class="line">    Dim result2 As Double</span><br><span class="line">    result2 = RandNum + Add(12, 345)</span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;函数：返回一个随机值</span><br><span class="line">Function RandNum()</span><br><span class="line">    RandNum = Rnd * 100</span><br><span class="line">End Function</span><br><span class="line">&#x27;函数：返回两数的和</span><br><span class="line">Function Add(num1 As Double, num2 As Double) As Double</span><br><span class="line">    Add = num1 + num2</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="提前退出函数"><a href="#提前退出函数" class="headerlink" title="提前退出函数"></a>提前退出函数</h2><p>正常情况下，函数使用 <code>Function</code> 和 <code>End Function</code> 语句作为函数的开始和结束。但有时根据实际情况，可能需要提前结束并退出函数。VBA 提供 2 种提前退出过程的方法，<code>Exit Function</code> 和 <code>End</code> 方法。</p>
<h3 id="Exit-Function-语句"><a href="#Exit-Function-语句" class="headerlink" title="Exit Function 语句"></a>Exit Function 语句</h3><p>在一个函数中，当程序运行到 <code>Exit Function</code> 语句时，立即结束<strong>当前函数</strong>，提前退出。</p>
<p><strong>这里需要注意的是，<code>Exit Function</code> 语句只作用于当前过程，不影响调用它的父过程或函数。</strong></p>
<h3 id="End-语句"><a href="#End-语句" class="headerlink" title="End 语句"></a>End 语句</h3><p>在一个函数，当程序运行到 <code>End</code> 语句时，立即<strong>结束当前运行的所有 VBA 过程和函数</strong>。</p>
<p>在实际开发中，应谨慎使用 <code>End</code> 结束语句。<code>End</code> 语句的效果类似于电脑的强制关机命令，立即结束所有程序，不会保存任何值，于 VBA 有以下效果：</p>
<ul>
<li>程序中对象的各类事件不会被触发；</li>
<li>任何在运行的 VBA 程序都会停止；</li>
<li>对象引用都会失效；</li>
<li>任何打开的窗体都被关闭。</li>
</ul>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>函数与过程类似，大部分用法相同，主要区别是函数可以返回一个值，而过程不可以。两者均可以接受0个或多个参数，参数可以在过程或函数里使用。调用函数时，参数需要放置在括号内部，接函数名后。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-function-basics/" data-id="clatcwe0h00b6xcq63iev3j7g" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-use-excel-vba-editor" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/use-excel-vba-editor/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/use-excel-vba-editor/">如何使用 Excel VBA 编辑器？</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p><a href="/study-excel/open-excel-vba-editor/">打开 VBA 编辑器</a>后，将会看到如下界面。图中已标出编辑器每个模块的名称。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_1923ab18fa56c9d9ef342dda81accb45.png"></p>
<p> </p>
<p>编辑器中每个模块的基本用法如下：</p>
<ul>
<li><strong>工具栏</strong>：编辑器命令栏，与 Excel 功能区域类似，包含 Excel VBA 开发相关的命令。</li>
<li><strong>VBA 工程</strong>：显示当前 VBA 工程包含的所有对象。通常，一个工作簿就是一个 VBA 工程，其中包括 Excel 对象、工作表对象、模块等。</li>
<li><strong>属性窗口</strong>：查看和设置选中对象的属性的窗口。</li>
<li><strong>代码编辑窗口</strong>：实际编写代码的位置。编写、修改、保存代码，都在这里进行。</li>
<li><strong>立即窗口</strong>：代码运行过程中，打印出的内容，在立即窗口中显示。一般用于调试代码。</li>
</ul>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/use-excel-vba-editor/" data-id="clatcwe0a00awxcq6g4g7he95" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-byval-byref-basic" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-byval-byref-basic/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-byval-byref-basic/">VBA 中 ByVal 和 ByRef 的基础用法和区别</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>VBA 中定义<a href="/study-excel/vba-subroutine-basics/">过程</a>或<a href="/study-excel/vba-function-basics/">函数</a>时，如果需要<a href="/study-excel/vba-pass-parameters/">传递变量</a>，需指定参数的传递类型，包括以下 2 类：</p>
<ul>
<li><strong>ByVal</strong>：传递参数的值</li>
<li><strong>ByRef</strong>：传递参数的引用</li>
</ul>
<p>本篇将介绍 2 种方法的用法以及区别。过程和函数传递参数方法基本相同，本篇以过程(Sub)举例说明他们的用法和区别。</p>
<h2 id="ByVal-和-ByRef-基础"><a href="#ByVal-和-ByRef-基础" class="headerlink" title="ByVal 和 ByRef 基础"></a>ByVal 和 ByRef 基础</h2><p>在定义过程或函数时，如果需要传递变量，则每个参数需要指定传递类型。传递类型有 2 种，分别是 <code>ByVal</code> 和 <code>ByRef</code> 。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#x27;ByVal 传递类型</span><br><span class="line">Sub TestSub1(ByVal msg As String)</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;ByRef 传递类型</span><br><span class="line">Sub TestSub2(ByRef msg As String)</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>针对基础数据类型，例如数字、文本等，两种传递类型的说明和区别如下：</p>
<ul>
<li><strong>ByVal</strong>：传递变量时，复制一份该变量，传入过程或函数。在过程和函数内部对该变量进行修改，只对该副本有效，对上一级过程（父过程）的变量没有影响。</li>
<li><strong>ByRef</strong>：传递变量时，将该变量的引用地址传入过程或函数。传入引用地址意味着，在过程或函数内部对其修改时，也会影响上一级过程（父过程）中的变量的值。</li>
</ul>
<h3 id="ByVal-实例"><a href="#ByVal-实例" class="headerlink" title="ByVal 实例"></a>ByVal 实例</h3><p>通过以下代码测试 ByVal 类型：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim msg As String</span><br><span class="line">    msg = &quot;main&quot;</span><br><span class="line">    </span><br><span class="line">    TestSub1 msg</span><br><span class="line">    </span><br><span class="line">    Msgbox msg</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;ByVal 传递类型</span><br><span class="line">Sub TestSub1(ByVal msg As String)</span><br><span class="line">    msg = &quot;val&quot;</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>首先定义一个 <code>msg</code> 变量，赋值 <code>main</code>，然后调用 <code>TestSub1</code> 过程，传入 <code>msg</code> 变量，在过程内部对 <code>msg</code> 重新赋值 <code>val</code>。最后返回上一个过程，显示 <code>msg</code> 变量。结果如下，<code>msg</code> 变量的值没有改变。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_5451b5460c6b011266d13146ca6cb474.png"></p>
<h3 id="ByRef-实例"><a href="#ByRef-实例" class="headerlink" title="ByRef 实例"></a>ByRef 实例</h3><p>通过以下代码测试 ByRef 类型：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim msg As String</span><br><span class="line">    msg = &quot;main&quot;</span><br><span class="line">    </span><br><span class="line">    TestSub2 msg</span><br><span class="line">    </span><br><span class="line">    MsgBox msg</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;ByRef 传递类型</span><br><span class="line">Sub TestSub2(ByRef msg As String)</span><br><span class="line">    msg = &quot;ref&quot;</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>首先定义一个 <code>msg</code> 变量，赋值 <code>main</code>，然后调用 <code>TestSub2</code> 过程，传入 <code>msg</code> 变量，在过程内部对 <code>msg</code> 重新赋值 <code>ref</code>。最后返回上一个过程，显示 <code>msg</code> 变量。结果如下，<code>msg</code> 变量的值已改变。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_8d9ac2e7a742ee3e6c7f643110df2914.png"></p>
<h2 id="省略传递类型"><a href="#省略传递类型" class="headerlink" title="省略传递类型"></a>省略传递类型</h2><p>默认情况下，当省略传递类型时，默认值是 <code>ByRef</code>，因此以下两种写法是等效的。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#x27;指定 ByVal 传递类型</span><br><span class="line">Sub TestSub1(ByRef msg As String)</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;省略传递类型</span><br><span class="line">Sub TestSub1(msg As String)</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<h2 id="使用-ByVal-和-ByRef-传递对象"><a href="#使用-ByVal-和-ByRef-传递对象" class="headerlink" title="使用 ByVal 和 ByRef 传递对象"></a>使用 ByVal 和 ByRef 传递对象</h2><p>在上述介绍中说道，以上机制适用于传递基础类型变量，例如数字、文本、逻辑值等。</p>
<p>使用 ByVal 和 ByRef 传递对象时，情况有些不同。具体用法和不同点将在介绍对象时详细说明。</p>
<h2 id="使用-ByVal-和-ByRef-传递数组"><a href="#使用-ByVal-和-ByRef-传递数组" class="headerlink" title="使用 ByVal 和 ByRef 传递数组"></a>使用 ByVal 和 ByRef 传递数组</h2><p>过程或函数传递数组时，只能以引用形式传递，即以 ByRef 形式。如果尝试用 ByVal 传递数组，VBA 会提示错误。详细的用法将在介绍数组时详细说明。</p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>ByVal 和 ByRef 表示参数传递的类型。针对基础数据类型的变量，ByVal 会创建变量的一个副本，传递给过程或函数，从此之后与父过程的变量没有关系。而 ByRef 方式传递变量的引用，该引用始终会与父过程的变量相连。</p>
<p>因此建议，尽量使用 ByVal 传递类型，防止在子过程或函数中，不小心更改父过程里的变量，导致一些不容易发现的问题。</p>
<p>对象和数组变量的传递，有别于基础类型变量，在相关的教程中详细说明。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-byval-byref-basic/" data-id="clatcwe0b00ayxcq68vtehx1c" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-difference-sub-function" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-difference-sub-function/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-difference-sub-function/">VBA 函数与过程的 6 个不同点</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>在上一篇教程中，我们学习了 <a href="/study-excel/vba-subroutine-basics/">VBA 过程</a>和 <a href="/study-excel/vba-function-basics/">VBA 函数</a>基础。教程中介绍了两者的基础用法，可以看到 VBA 过程和函数有很多相似的地方。同时，文章指出函数相对过程最大的不同点是，VBA 函数可以返回值。</p>
<p>今天这篇教程，给大家进一步介绍函数与子过程 6 个不同点。理解这 6 点将帮助大家理清两者的关系，在实际开发中，熟练地混合使用函数和子过程。</p>
<h2 id="第1点：声明语句不同"><a href="#第1点：声明语句不同" class="headerlink" title="第1点：声明语句不同"></a>第1点：声明语句不同</h2><p>函数的声明语句是 <code>Function</code> 和 <code>End Function</code>，而过程的声明语句是 <code>Sub</code> 和 <code>End Sub</code>。</p>
<p>下面的代码是<strong>函数声明</strong>代码：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Function MyFunc()</span><br><span class="line">    </span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p>下面的代码是<strong>子过程声明</strong>代码：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Sub SayHello()</span><br><span class="line">    </span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="第2点：函数可以返回值"><a href="#第2点：函数可以返回值" class="headerlink" title="第2点：函数可以返回值"></a>第2点：函数可以返回值</h2><p>函数相对子过程最大的不同点是，函数可以返回指定的值。调用函数时，使用一个变量存储函数返回的值，可以在后续的代码中使用。</p>
<p>这里需要指出的是，函数可以不返回值，这种情况其作用与子过程相同。因此建议，不需要返回值时，直接使用子过程代替函数。</p>
<p> </p>
<h2 id="第3点：函数需指定返回值类型"><a href="#第3点：函数需指定返回值类型" class="headerlink" title="第3点：函数需指定返回值类型"></a>第3点：函数需指定返回值类型</h2><p>在《<a href="/study-excel/vba/vba-variable-operators/">VBA 变量、类型和运算符</a>》一章中讲到，VBA 中数据有多种类型，准确使用数据类型可以使程序效率更高。</p>
<p>同样，函数声明时也需要指定其返回值的类型。其语法与变量声明类似，在函数名后指定数据类型。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Function MyFunc() As String &#x27;指定返回值类型，此函数将返回文本类型的值</span><br><span class="line">    </span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="第4点：函数主体代码中，返回值赋值到函数自己"><a href="#第4点：函数主体代码中，返回值赋值到函数自己" class="headerlink" title="第4点：函数主体代码中，返回值赋值到函数自己"></a>第4点：函数主体代码中，返回值赋值到函数自己</h2><p>函数返回一个值，是通过在函数主体代码中，将返回的值赋值到函数自己的方法来实现。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Function MyFunc() As String</span><br><span class="line">    &#x27;此函数将返回 Hello World 的文本</span><br><span class="line">    MyFunc = &quot;Hello World&quot;</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="第5点：调用函数时，使用类型与函数返回值类型相同的变量获得返回值"><a href="#第5点：调用函数时，使用类型与函数返回值类型相同的变量获得返回值" class="headerlink" title="第5点：调用函数时，使用类型与函数返回值类型相同的变量获得返回值"></a>第5点：调用函数时，使用类型与函数返回值类型相同的变量获得返回值</h2><p>当主程序中调用函数获取其值时，需要使用类型与函数返回值类型相同的变量，否则程序会出错。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Sub MyCode()</span><br><span class="line">    </span><br><span class="line">    Dim text As String &#x27;声明与函数返回值相同类型的变量</span><br><span class="line">    text = MyFunc &#x27;调用函数，获得其返回的值</span><br><span class="line">    Range(&quot;A1&quot;) = text &#x27;使用函数返回的值</span><br><span class="line">    </span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">&#x27;此函数被上面的过程调用</span><br><span class="line">Function MyFunc() As String</span><br><span class="line">    &#x27;此函数将返回 Hello World 的文本</span><br><span class="line">    MyFunc = &quot;Hello World&quot;</span><br><span class="line">End Function</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="第6点：函数可在单元格内公式中使用"><a href="#第6点：函数可在单元格内公式中使用" class="headerlink" title="第6点：函数可在单元格内公式中使用"></a>第6点：函数可在单元格内公式中使用</h2><p>与 Excel 内置的函数一样，用户自定义编写的函数可在公式中直接使用，其用法与内置函数一样。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_6d10430281ab3b84c43a219089a33811.png"></p>
<p>自定义函数也一样可以嵌套使用：</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_c157495ac3f1f9d2b8ed0c5821378f13.png"></p>
<p> </p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>函数与过程最大的不同是，函数可以返回值，本篇教程在此基础上，总结了函数与子过程的 6 个不同点。根据函数和子过程的不同特性，实际代码中混合使用两者，可以提高开发效率，也有助于更好地组织代码。</p>
<p>学习完不同点，在本章其余教程中，将介绍函数和子过程相似的特性，深入了解函数和子过程的用法。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-difference-sub-function/" data-id="clatcwe0e00b2xcq6dcija2da" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-open-excel-vba-editor" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/open-excel-vba-editor/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/open-excel-vba-editor/">如何打开 Excel VBA 编辑器？</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>Excel 进行 VBA 开发在 VBA 编辑器中进行。第一步将会是打开 Excel VBA 编辑器。本篇介绍打开 Excel 编辑器的三种方法。</p>
<h2 id="方法一：从功能区开发工具打开"><a href="#方法一：从功能区开发工具打开" class="headerlink" title="方法一：从功能区开发工具打开"></a>方法一：从功能区开发工具打开</h2><p>点击<a href="/study-excel/open-developer-tab/">开发工具</a>选项卡<code>Visual Basic</code>命令。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_a3bde5bb41789a636a7bd081e684dcb7.png"></p>
<p><em>如何启用 Excel 开发工具选项卡，阅读→<a href="/study-excel/open-developer-tab/">启用 Excel 开发工具教程</a></em></p>
<h2 id="方法二：从工作表名称打开"><a href="#方法二：从工作表名称打开" class="headerlink" title="方法二：从工作表名称打开"></a>方法二：从工作表名称打开</h2><p>在任意工作表标签上方，右键，在弹出的选项列表中，选择「查看代码」。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_288ef24c3e28d043c56b79addc3cb66d.png"></p>
<h2 id="方法三：使用快捷键打开"><a href="#方法三：使用快捷键打开" class="headerlink" title="方法三：使用快捷键打开"></a>方法三：使用快捷键打开</h2><p>使用<a href="/study-excel/basic-shortcuts-more-open-vbe/">快捷键 Alt + F11</a>。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_aa4c1d38b77477cff102ed38ebcd753a.png"></p>
<h2 id="Excel-VBA-编辑器"><a href="#Excel-VBA-编辑器" class="headerlink" title="Excel VBA 编辑器"></a>Excel VBA 编辑器</h2><p>Excel VBA 编辑器打开后如下所示：</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_be57e89c92aeb3f8af25be0dd4eaa7d7.png"></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/open-excel-vba-editor/" data-id="clatcwe0f00b4xcq60egs32zx" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-export-import-module" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-export-import-module/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-export-import-module/">VBA 编辑器如何导入/导出模块？</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>在实际开发中，有时需要将一个 VBA 项目中一个或多个模块、用户窗体保存下来，用在其他 VBA 项目中。Excel 为此提供了模块的导出&#x2F;导入功能。</p>
<p>本篇文章介绍如何导出 VBA 模块、用户窗体，以及如何在新的项目中导入已被导出的模块。</p>
<p>本篇以模块为例介绍，用户窗体、类模块的方法类似。</p>
<h2 id="导出模块"><a href="#导出模块" class="headerlink" title="导出模块"></a>导出模块</h2><h3 id="第一步，右键导出的模块"><a href="#第一步，右键导出的模块" class="headerlink" title="第一步，右键导出的模块"></a>第一步，右键导出的模块</h3><p>选择要导出的模块，鼠标右键，在弹出的菜单列表中选择【导出文件】命令。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_c2b450033faa98e9f8ac4952da1b3f83.png"></p>
<h3 id="第二步，选择保存的位置"><a href="#第二步，选择保存的位置" class="headerlink" title="第二步，选择保存的位置"></a>第二步，选择保存的位置</h3><p>点击导出文件后，弹出选择保存位置的对话框，选择要保存的位置，给导出的模块文件命名，然后点击确定。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_f16450834842f9d8eafccf01be1ce40f.png"></p>
<h3 id="第三步，导出完成"><a href="#第三步，导出完成" class="headerlink" title="第三步，导出完成"></a>第三步，导出完成</h3><p>VBA 模块导出的文件类型是【.bas】类型文件，可以使用记事本、代码编辑器等文本编辑器打开并修改。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_9dcf4cdfeec44e6d31908a460c7a71f2.png"></p>
<p> </p>
<h2 id="导入模块"><a href="#导入模块" class="headerlink" title="导入模块"></a>导入模块</h2><h3 id="第一步，选择要导入到的-VBA-工程"><a href="#第一步，选择要导入到的-VBA-工程" class="headerlink" title="第一步，选择要导入到的 VBA 工程"></a>第一步，选择要导入到的 VBA 工程</h3><p>选择要把模块导入到的 VBA 工程，然后鼠标右键，在弹出的菜单中选择【导入文件】。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_3102727fd194b326077647e825147975.png"></p>
<h3 id="第二步，选择要导入的-VBA-模块文件"><a href="#第二步，选择要导入的-VBA-模块文件" class="headerlink" title="第二步，选择要导入的 VBA 模块文件"></a>第二步，选择要导入的 VBA 模块文件</h3><p>上一步后出现选择 VBA 模块文件的对话框，其中浏览找到要导入的 VBA 模块文件，然后点击打开。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_20ce1949bc52d06646404d9d2e4f4da0.png"></p>
<h3 id="第三步，导入成功"><a href="#第三步，导入成功" class="headerlink" title="第三步，导入成功"></a>第三步，导入成功</h3><p>接上一步，VBA 模块导入成功，可在对应的对象文件夹里看到导入的模块。其导入的名称与导出前的名称相同。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_aa43239c8019aa2a10e1a721c82aa3a0.png"></p>
<p> </p>
<p> </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-export-import-module/" data-id="clatcwe0i00b8xcq660s5by7a" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-variable-scope" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-variable-scope/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-variable-scope/">VBA 变量作用域</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>VBA 中，<a href="/study-excel/vba-variable-declaration/">变量</a>的作用域决定变量在哪里能被获取和使用。根据变量的声明位置和声明方式，变量的作用域有以下 4 种：</p>
<ol>
<li>过程作用域</li>
<li>模块作用域</li>
<li>工程作用域</li>
<li>全局作用域</li>
</ol>
<p>下面将逐一介绍每一种作用域对应的变量的声明方法以及使用方法。</p>
<h2 id="1-过程作用域"><a href="#1-过程作用域" class="headerlink" title="1.过程作用域"></a>1.过程作用域</h2><p>在<a href="/study-excel/vba-subroutine-basics/">过程</a>或<a href="/study-excel/vba-function-basics/">函数</a>内部声明的变量，只有在当前过程或函数内被使用。例如：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim name As String</span><br><span class="line">    Dim age As Integer</span><br><span class="line">    </span><br><span class="line">    name = &quot;张三&quot;</span><br><span class="line">    age = 35</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上代码中，变量 <code>name</code> 和 <code>age</code> 在 <code>Test</code> 过程声明，因此它们只能在该过程中内使用，包括赋值和读取。如果尝试在外部和其他过程中直接使用它们，VBA 会提示<strong>变量未定义错误</strong>。</p>
<h2 id="2-模块作用域"><a href="#2-模块作用域" class="headerlink" title="2.模块作用域"></a>2.模块作用域</h2><p>一个模块中，在任何一个过程和函数外面，使用关键词 <code>Private</code> 或 <code>Dim</code> 声明的变量，称之为<strong>模块变量</strong>，其作用域是当前模块。例如，</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">Dim guest As String</span><br><span class="line"></span><br><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim message As String</span><br><span class="line">    </span><br><span class="line">    guest = &quot;张三&quot;</span><br><span class="line">    message = &quot;你好&quot;</span><br><span class="line">    </span><br><span class="line">    MsgBox message &amp; &quot;！ &quot; &amp; guest</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上代码中，变量 <code>guest</code> 是在过程 <code>Test</code> 外面，使用 <code>Dim</code> 关键词声明的，称之为模块变量。模块变量的作用域是当前模块，<strong>在模块里面任何过程和函数内均可以使用</strong>。</p>
<p>如前文所述，使用关键词 <code>Private</code> 或 <code>Dim</code> 声明的变量，都是模块变量，因此以下两种声明方式是等效的。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Dim guest As String</span><br><span class="line">Private guest As String</span><br></pre></td></tr></table></figure>

<h2 id="3-工程作用域"><a href="#3-工程作用域" class="headerlink" title="3.工程作用域"></a>3.工程作用域</h2><p>Excel VBA 中，一个 <a href="/study-excel/basic-shortcuts-file-new-book/">Excel 工作簿</a>是一个 VBA 工程。与之对应，工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。</p>
<p>工程级别变量，在所在模块顶部声明 <code>Option Private Module</code> 修饰语句前提下，在过程或函数外面，使用关键词 <code>Public</code> 声明的变量，其作用域是当前工程。例如，</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Option Private Module</span><br><span class="line"></span><br><span class="line">Public guest As String</span><br><span class="line"></span><br><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim message As String</span><br><span class="line">    </span><br><span class="line">    guest = &quot;张三&quot;</span><br><span class="line">    message = &quot;你好&quot;</span><br><span class="line">    </span><br><span class="line">    MsgBox message &amp; &quot;！ &quot; &amp; guest</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上例子中，变量 <code>guest</code> 是使用 <code>Public</code> 关键词声明，是工程级别变量。它在当前工程中其他的模块中也能被使用。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_da52fc2ab5e01fabd328039d3a12c297.png"></p>
<h2 id="4-全局作用域"><a href="#4-全局作用域" class="headerlink" title="4.全局作用域"></a>4.全局作用域</h2><p>全局作用域表示，全局变量在打开的任何一个工作簿都可以被使用。全局变量的声明方式与工程变量相似，不同点是<strong>不使用模块顶部的 <code>Option Private Module</code> 修饰语句</strong>。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_60a233cd62b9f66ff92e37a21247c4c5.png"></p>
<h2 id="作用域冲突"><a href="#作用域冲突" class="headerlink" title="作用域冲突"></a>作用域冲突</h2><p>当相同名称的变量，多次以不同的作用域声明时，出现作用域冲突。这种情况，VBA 会自动以<strong>就近原则</strong>使用变量，即优先使用最近定义的变量。例如，</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Dim name As String</span><br><span class="line"></span><br><span class="line">Sub Test()</span><br><span class="line"></span><br><span class="line">    Dim name As String</span><br><span class="line">    </span><br><span class="line">    name = &quot;李四&quot;</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上例子中，两次声明 <code>name</code> 变量，分别是模块变量和过程变量。根据就近原则，在过程内部使用时，将使用过程变量。</p>
<p> </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-variable-scope/" data-id="clatcwe0k00bcxcq61ys5gp2f" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-procedure-scope" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-procedure-scope/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-procedure-scope/">VBA 过程或函数作用域</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>VBA 中的过程和函数，与<a href="/study-excel/vba-variable-scope/">变量类似</a>，也具有不同的作用域。根据声明位置和方式，有 3 种作用域：</p>
<ol>
<li>模块作用域</li>
<li>工程作用域</li>
<li>全局作用域</li>
</ol>
<h2 id="1-模块作用域"><a href="#1-模块作用域" class="headerlink" title="1.模块作用域"></a>1.模块作用域</h2><p>在模块中，使用 <strong>Private</strong> 关键词声明的过程或函数，具备模块作用域，只能在当前模块中使用。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Private Sub Test()</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<h2 id="2-工程作用域"><a href="#2-工程作用域" class="headerlink" title="2.工程作用域"></a>2.工程作用域</h2><p>在模块中，顶部声明 <code>Option Private Module</code> 修饰语句，并且直接声明或使用 Public 关键词声明的过程或函数，具备工程作用域，在当前工程的所有模块中使用。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Option Private Module</span><br><span class="line"></span><br><span class="line">Sub Test1()</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">Public Sub Test2()</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上例子中，Test1 过程和 Test2 过程均具备工程作用域。由于直接声明和使用关键词 <code>Public</code> 是等效的，因此可以省略 <code>Public</code> 关键词。</p>
<h2 id="3-全局作用域"><a href="#3-全局作用域" class="headerlink" title="3.全局作用域"></a>3.全局作用域</h2><p>在模块中，直接声明或使用 Public 关键词声明的过程或函数，具备全局作用域。例如，</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Sub Test1()</span><br><span class="line"></span><br><span class="line">End Sub</span><br><span class="line"></span><br><span class="line">Public Sub Test2()</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>以上例子中，Test1 过程和 Test2 过程均具备全局作用域，可以在打开的任何一个工作簿中使用。</p>
<p>此外，它们还能直接在工作簿宏列表中执行。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_abd4dc9f6dd92179d6338185e01268fa.png"></p>
<p> </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-procedure-scope/" data-id="clatcwe0m00bgxcq606bwbiyt" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-vba-pass-parameters" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/vba-pass-parameters/" class="article-date">
  <time datetime="2022-11-23T08:00:48.447Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/VBA/">VBA</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/vba-pass-parameters/">VBA 过程和函数：传递参数教程和实例</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>VBA 中，<a href="/study-excel/vba-difference-sub-function/">调用子过程或函数</a>时，我们可以为它们传递参数。提供的参数可以在子过程或函数内部使用，让程序更动态和灵活。传递参数的前提是，先在子过程或函数定义阶段设置参数，后在调用时按正确的方式提供实际参数值。</p>
<p>本篇教程主要介绍传递参数的基础部分，主要内容包括：</p>
<ul>
<li>带参数的子过程和函数的定义方法。</li>
<li>调用子过程和函数时，参数的书写方式。</li>
<li>可选参数的语法和实际用法。</li>
</ul>
<p>关于子过程和函数、它们的区别以及如何调用，请看前几篇内容。</p>
<p><strong>在子过程和函数中，传递参数的用法基本相同，本篇以子过程为例介绍参数的使用，函数中用法参考子过程。</strong></p>
<h2 id="带参数的子过程定义方法"><a href="#带参数的子过程定义方法" class="headerlink" title="带参数的子过程定义方法"></a>带参数的子过程定义方法</h2><p>子过程可以接受一个或多个参数，参数可以是<a href="/study-excel/vba-constant-variable/">常量</a>、<a href="/study-excel/vba-variable/">变量</a>、<a href="/study-excel/vba-expression-statement/">表达式</a>，并且每个参数指定其名称和<a href="/study-excel/vba-data-type/">数据类型</a>。</p>
<p>看实际的例子，以下代码定义了带两个参数的一个过程，过程名是 <code>CustomLog</code> ，参数分别是 <code>num</code> 和 <code>base</code>。此过程的用途是计算任意底数的对数，<code>num</code> 是计算对数的值，<code>base</code> 是底数。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x27;声明一个带参数的子过程</span><br><span class="line">Sub CustomLog(num As Double, base As Integer)</span><br><span class="line">    Debug.Print Log(num) / Log(base)</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>子过程按照这种方法定义后，调用时，VBA 会提示需要提供什么参数以及参数类型。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_387eee8e1561a6c7e911606c14bcb91d.png"></p>
<h2 id="调用带参数的子过程"><a href="#调用带参数的子过程" class="headerlink" title="调用带参数的子过程"></a>调用带参数的子过程</h2><p>调用带参数的过程，只需将参数<strong>按定义顺序</strong>书写即可，多个参数使用逗号分开。</p>
<p>以上述过程为例，在一个主过程调用 CustomLog 子过程。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x27;主入口</span><br><span class="line">Sub Main()</span><br><span class="line">    CustomLog 100, 10</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>除了按顺序书写参数外，也可以按任意顺序书写参数，但是这时需要<strong>给出参数名</strong>。带参数名的传递参数语法如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[参数名]:=[实际参数值]</span><br></pre></td></tr></table></figure>

<p>参数名后写冒号等号(:&#x3D;)，再写需传递的参数值。看实际的例子，以下三种方式是等效的。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#x27;主入口</span><br><span class="line">Sub Main()</span><br><span class="line">    CustomLog 100, 10 &#x27;方式一</span><br><span class="line">    CustomLog num:=100, base:=10 &#x27;方式二</span><br><span class="line">    CustomLog base:=10, num:=100 &#x27;方式三</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p> </p>
<h2 id="可选参数的用法"><a href="#可选参数的用法" class="headerlink" title="可选参数的用法"></a>可选参数的用法</h2><p>实际开发中，有时子过程的参数可能不是必须的，我们希望根据参数有无情况，执行不同的操作。针对这种情况，VBA 提供了可选参数机制。</p>
<h3 id="可选参数语法"><a href="#可选参数语法" class="headerlink" title="可选参数语法"></a>可选参数语法</h3><p>可选参数在定义子过程时需要指定，方法是在参数名前添加 <code>Optional</code> 关键词。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Optional [参数名] As [数据类型]</span><br></pre></td></tr></table></figure>

<p>还是以 <code>CustomLog</code> 子过程为例，我们把底数 <code>base</code> 设为可选参数。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x27;声明一个带可选参数的子过程</span><br><span class="line">Sub CustomLog(num As Double, Optional base As Integer)</span><br><span class="line">    &#x27;子过程代码</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>调用时，VBA 会提示可选参数，参数放置在中括号中。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_11ca36e4b6d556a4616fa4081555dfe9.png"></p>
<h3 id="设置可选参数的默认值"><a href="#设置可选参数的默认值" class="headerlink" title="设置可选参数的默认值"></a>设置可选参数的默认值</h3><p>可选参数定以后，如果在子过程中使用，需要判断参数有无提供。否则未提供而直接使用时，程序会出错。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_0b327d718c6d21678f20f58cabcb238a.png"></p>
<p>针对这种情况，VBA 提供了默认值机制，即可选参数未提供时，使用预算设置好的默认值。</p>
<p>可选参数默认值，在定义过程时就设置，语法如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Optional [参数名] As [数据类型] = [默认值]</span><br></pre></td></tr></table></figure>

<p>还是以 <code>CustomLog</code> 子过程为例，我们把底数 <code>base</code> 设为可选参数，并且默认值设为 10。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#x27;声明一个带可选参数的子过程</span><br><span class="line">Sub CustomLog(num As Double, Optional base As Integer = 10)</span><br><span class="line">    Debug.Print Log(num) / Log(base)</span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<p>调用时，如果提供了 base 底数，则以提供的底数计算；如果未提供 base 底数，则以默认值 10 计算。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#x27;主入口</span><br><span class="line">Sub Main()</span><br><span class="line"></span><br><span class="line">    CustomLog 100, 100 &#x27;返回 1</span><br><span class="line">    CustomLog 100 &#x27;返回 2</span><br><span class="line"></span><br><span class="line">End Sub</span><br></pre></td></tr></table></figure>

<h3 id="可选参数的位置"><a href="#可选参数的位置" class="headerlink" title="可选参数的位置"></a>可选参数的位置</h3><p>当子过程有多个参数时，其中的<strong>可选参数需写在参数列表的末尾</strong>，否则 VBA 提示错误。</p>
<p>可选参数错误顺序：</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_41a3ee1fc3f98ff47b9a291c76632453.png"></p>
<p>可选参数的正确顺序：</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_97efa3176b2aa610d859aec54235111e.png"></p>
<p> </p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>VBA 过程和函数均可以接受一个或多个参数。当调用它们时，需要注意传入的参数的书写顺序：不写参数名时，按照定义的顺序传递；写参数名时，对书写顺序没有要求。此外，过程和函数可以设置某一个参数是可选的，类似 VLOOKUP 函数的第四个参数，是否精确查找。当设置成可选时，还可以指定可选参数的默认值。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/vba-pass-parameters/" data-id="clatcwe0r00bmxcq6etmi07h8" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  
    <article id="post-month-sum" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/study-excel/month-sum/" class="article-date">
  <time datetime="2022-11-23T08:00:48.431Z" itemprop="datePublished">2022-11-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/study-excel/categories/%E5%85%AC%E5%BC%8F/">公式</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 itemprop="name">
      <a class="article-title" href="/study-excel/month-sum/">Excel 根据日期按月汇总公式</a>
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <p>实际中很多数据按发生日期记录的，有时需要根据日期，按月汇总对应的记录。这种时候需要将日期转换为月，但是普通的 <a href="/study-excel/excel-sumif-function/">SUMIF 函数</a>中不能直接使用其他函数转换日期。</p>
<p>本篇介绍使用 <a href="/study-excel/excel-sumproduct-function/">SUMPRODUCT 函数</a>根据日期按月汇总数据。</p>
<h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>现有以下数据，某一公司每天的销售额，要求根据左侧日期，对2月总销售额进行汇总。</p>
<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_a1ff47879ecf6e59e89cbe78e34bb608.png"></p>
<p> </p>
<h2 id="公式思路"><a href="#公式思路" class="headerlink" title="公式思路"></a>公式思路</h2><ol>
<li><a href="/study-excel/excel-sumproduct-function/">SUMPRODUCT 函数</a>内可以用其他方法对一列数据进行转换；</li>
<li>根据要求，需要将日期转换为月，因此使用 <a href="/study-excel/excel-month-function/">MONTH 函数</a>；</li>
<li>转换后的值与指定月比较，相等返回 TRUE，否则返回 FALSE；</li>
<li>使用双减（–）符号把逻辑值转换成 0、1；</li>
<li>利用 SUMPRODUCT 函数的特性，比较结果（0、1值）与求和列相乘，得到值 1 对应数据之和。</li>
</ol>
<p> </p>
<h2 id="通用公式"><a href="#通用公式" class="headerlink" title="通用公式"></a>通用公式</h2><p>根据以上思路，写出按月汇总通用公式如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=SUMPRODUCT(--(MONTH(日期列)=月)*求和列)</span><br></pre></td></tr></table></figure>

<p>本例中，具体的公式如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=SUMPRODUCT(--(MONTH(B3:B11)=B15)*C3:C11)</span><br></pre></td></tr></table></figure>

<p><img src="https://university-oss-2022.oss-cn-guangzhou.aliyuncs.com/easyexcel/uploads/im_80f039d2d90a318764b4dcbd6d12f923.png"></p>
<p> </p>
<h2 id="相关公式"><a href="#相关公式" class="headerlink" title="相关公式"></a>相关公式</h2><p>根据上述思路，对公式稍加更改，使用 <a href="/study-excel/excel-year-function/"><strong>YEAR 函数</strong></a>和 <a href="/study-excel/excel-day-function/"><strong>DAY 函数</strong></a>，就可以写出按年汇总、按天汇总公式。</p>
<p>按年汇总通用公式如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=SUMPRODUCT(--(YEAR(日期列)=年)*求和列)</span><br></pre></td></tr></table></figure>

<p>按天汇总通用公式如下：</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">=SUMPRODUCT(--(DAY(日期列)=天)*求和列)</span><br></pre></td></tr></table></figure>

<p> </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://lecoder.gitee.io/study-excel/month-sum/" data-id="clatcw9na000ixcq6atjlf0lp" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
</article>


  


  <nav id="page-nav">
    
    <a class="extend prev" rel="prev" href="/study-excel/page/65/">&amp;laquo; 上一页</a><a class="page-number" href="/study-excel/">1</a><span class="space">&hellip;</span><a class="page-number" href="/study-excel/page/64/">64</a><a class="page-number" href="/study-excel/page/65/">65</a><span class="page-number current">66</span><a class="page-number" href="/study-excel/page/67/">67</a><a class="page-number" href="/study-excel/page/68/">68</a><span class="space">&hellip;</span><a class="page-number" href="/study-excel/page/94/">94</a><a class="extend next" rel="next" href="/study-excel/page/67/">下一页 &amp;raquo;</a>
  </nav>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/VBA/">VBA</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%85%AC%E5%BC%8F/">公式</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%87%BD%E6%95%B0/">函数</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">函数与公式基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80/%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">公式基础</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80/%E5%85%AC%E5%BC%8F%E9%94%99%E8%AF%AF/">公式错误</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8A%9F%E8%83%BD/">功能</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8A%9F%E8%83%BD%E5%8C%BA/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8A%9F%E8%83%BD%E5%8C%BA/%E5%9F%BA%E7%A1%80/%E5%85%AC%E5%BC%8F/">公式</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8D%95%E5%85%83%E6%A0%BC%E5%BC%95%E7%94%A8/">单元格引用</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8D%95%E5%85%83%E6%A0%BC%E5%BC%95%E7%94%A8/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%8D%95%E5%85%83%E6%A0%BC%E5%BC%95%E7%94%A8/%E5%9F%BA%E7%A1%80/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">函数与公式基础</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/">基本概念</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E5%9F%BA%E7%A1%80/%E4%BD%BF%E7%94%A8-Excel/">使用 Excel</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E5%9F%BA%E7%A1%80/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F/">函数与公式</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E5%9F%BA%E7%A1%80/%E5%8D%95%E5%85%83%E6%A0%BC/">单元格</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/">基本设置</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E7%A1%80/%E4%BF%9D%E5%AD%98%E8%AE%BE%E7%BD%AE/">保存设置</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E7%A1%80/%E5%85%AC%E5%BC%8F%E8%AE%BE%E7%BD%AE/">公式设置</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E7%A1%80/%E5%85%B6%E4%BB%96%E8%AE%BE%E7%BD%AE/">其他设置</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/">基础</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">基础操作</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E4%BF%9D%E6%8A%A4/">保护</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%A4%8D%E5%88%B6%E5%85%AC%E5%BC%8F/">复制公式</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%A4%8D%E5%88%B6%E5%85%AC%E5%BC%8F/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">函数与公式基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%AE%A1%E9%98%85/">审阅</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%AE%A1%E9%98%85/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B7%A5%E4%BD%9C%E7%95%8C%E9%9D%A2/">工作界面</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B7%A5%E4%BD%9C%E7%95%8C%E9%9D%A2/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/">基本概念</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E6%9C%AF%E8%AF%AD/">常见术语</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%81%E6%9C%AF%E8%AF%AD/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/">基本概念</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%84%E8%AE%BE%E7%BD%AE/">常规设置</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%B8%B8%E8%A7%84%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/">基本设置</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%BC%80%E5%A7%8B/">开始</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E5%BC%80%E5%A7%8B/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%8F%92%E5%85%A5/">插入</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%8F%92%E5%85%A5/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE/">数据</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%92%8C%E5%87%BD%E6%95%B0/">新增功能和函数</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%92%8C%E5%87%BD%E6%95%B0/Excel-2007/">Excel 2007</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%92%8C%E5%87%BD%E6%95%B0/Excel-2010/">Excel 2010</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%92%8C%E5%87%BD%E6%95%B0/Excel-2013/">Excel 2013</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD%E5%92%8C%E5%87%BD%E6%95%B0/Excel-2016/">Excel 2016</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%A0%A1%E5%AF%B9%E8%AE%BE%E7%BD%AE/">校对设置</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E6%A0%A1%E5%AF%B9%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/">基本设置</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E7%BC%96%E5%86%99%E5%85%AC%E5%BC%8F/">编写公式</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E7%BC%96%E5%86%99%E5%85%AC%E5%BC%8F/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">函数与公式基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E7%BC%96%E8%BE%91%E5%85%AC%E5%BC%8F/">编辑公式</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E7%BC%96%E8%BE%91%E5%85%AC%E5%BC%8F/%E5%87%BD%E6%95%B0%E4%B8%8E%E5%85%AC%E5%BC%8F%E5%9F%BA%E7%A1%80/">函数与公式基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E8%A7%86%E5%9B%BE/">视图</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E8%A7%86%E5%9B%BE/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%A1%B5%E9%9D%A2%E5%B8%83%E5%B1%80/">页面布局</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%A1%B5%E9%9D%A2%E5%B8%83%E5%B1%80/%E5%8A%9F%E8%83%BD%E5%8C%BA/">功能区</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%AB%98%E7%BA%A7%E8%AE%BE%E7%BD%AE/">高级设置</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%AB%98%E7%BA%A7%E8%AE%BE%E7%BD%AE/%E5%9F%BA%E6%9C%AC%E8%AE%BE%E7%BD%AE/">基本设置</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%BC%A0%E6%A0%87%E6%8C%87%E9%92%88/">鼠标指针</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80/%E9%BC%A0%E6%A0%87%E6%8C%87%E9%92%88/%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/">基本概念</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">基础操作</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%A4%8D%E5%88%B6%E4%B8%8E%E7%B2%98%E8%B4%B4/">复制与粘贴</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E5%A4%8D%E5%88%B6%E4%B8%8E%E7%B2%98%E8%B4%B4/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%89%93%E5%8D%B0/">打印</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%89%93%E5%8D%B0/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%9F%A5%E6%89%BE%E4%B8%8E%E9%80%89%E6%8B%A9/">查找与选择</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E6%9F%A5%E6%89%BE%E4%B8%8E%E9%80%89%E6%8B%A9/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%8D%95%E5%85%83%E6%A0%BC%E6%A0%BC%E5%BC%8F/">编辑单元格格式</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%8D%95%E5%85%83%E6%A0%BC%E6%A0%BC%E5%BC%8F/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%B7%A5%E4%BD%9C%E8%A1%A8/">编辑工作表</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%B7%A5%E4%BD%9C%E8%A1%A8/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%B7%A5%E4%BD%9C%E8%A1%A8%E5%8C%BA%E5%9F%9F/">编辑工作表区域</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E5%B7%A5%E4%BD%9C%E8%A1%A8%E5%8C%BA%E5%9F%9F/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%97%E6%A0%BC%E5%BC%8F/">编辑数字格式</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E7%BC%96%E8%BE%91%E6%95%B0%E5%AD%97%E6%A0%BC%E5%BC%8F/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E9%BC%A0%E6%A0%87%E6%93%8D%E4%BD%9C/">鼠标操作</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/%E9%BC%A0%E6%A0%87%E6%93%8D%E4%BD%9C/%E5%9F%BA%E7%A1%80/">基础</a></li></ul></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E5%BF%AB%E6%8D%B7%E9%94%AE/">快捷键</a></li><li class="category-list-item"><a class="category-list-link" href="/study-excel/categories/%E9%97%AE%E9%A2%98/">问题</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/study-excel/archives/2022/11/">十一月 2022</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/study-excel/excel-coupdaybs-function/">Excel COUPDAYBS 函数</a>
          </li>
        
          <li>
            <a href="/study-excel/excel-coupdays-function/">Excel COUPDAYS 函数</a>
          </li>
        
          <li>
            <a href="/study-excel/excel-coupdaysnc-function/">Excel COUPDAYSNC 函数</a>
          </li>
        
          <li>
            <a href="/study-excel/excel-coupncd-function/">Excel COUPNCD 函数</a>
          </li>
        
          <li>
            <a href="/study-excel/excel-coupnum-function/">Excel COUPNUM 函数</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2022 lijile<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/study-excel/" class="mobile-nav-link">Home</a>
  
    <a href="/study-excel/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  
<link rel="stylesheet" href="/study-excel/fancybox/jquery.fancybox.css">

  
<script src="/study-excel/fancybox/jquery.fancybox.pack.js"></script>




<script src="/study-excel/js/script.js"></script>




  </div>
</body>
</html>